home *** CD-ROM | disk | FTP | other *** search
/ Stone Design / Stone Design.iso / Stone_Friends / Wave / WavesWorld / Documentation / WW3DKit / stuff / EveRef < prev    next >
Encoding:
Text File  |  1995-03-22  |  5.8 KB  |  132 lines

  1. Eve is an evolving language for describing autonomous, animated
  2. characters.  At its core, eve is based on tcl, the tool command
  3. language developed by John Ousterhout at Berkeley.  For 3D geometry,
  4. eve uses the RenderMan(TM) interface, which allows it to describe a
  5. wide area of different geometry and surfaces.  
  6.  
  7. It is assumed that any reader that is serious about learning and using
  8. eve has gotten the standard documentation for both tcl and RenderMan.
  9. For tcl, there is a book called "Tcl and the Tk ToolKit" from
  10. Addison-Wesley. Also, there are the excellent man pages that I include
  11. in the standard source distribution of WavesWorld.  For RenderMan, the
  12. book "The RenderMan Companion" by Steve Upstill is an excellent
  13. introduction.  If possible, serious readers are urged to try to obtain
  14. a copy of the document entitled "The RenderMan Interface, Version 3.1,
  15. September 1989" available from Pixar.
  16.  
  17. For the remainder of this document, I'll assume that the reader at
  18. least has access to the man pages for tcl and a copy of the "RenderMan
  19. Companion."
  20.  
  21. Eve usually comes in two flavors.  The first is really just as a very
  22. simple layer on top of RIB (RenderMan's file format).  In this form,
  23. eve is really just being used as an interpreted language (vs. a
  24. compiled one like C), and is really there to allow the user to build
  25. compact model descriptions which expand to RIB code.  The second is
  26. the more interesting, and is the one used in the WW3DKit, wherein eve
  27. code is compiled into a displayable, manipulatable shape hierarchy.
  28.  
  29. Since the model is being constantly reevaluated each time it is
  30. displayed (as opposed to going straight to a RIB file as in the first
  31. way), there is an opportunity to change the values of parts of the
  32. model.  Eve supports a notion of an articulated/animated model; that
  33. is, one which changes over time.  It implements this by adding two new
  34. commands to tcl: one for articulated commands and one for articulated
  35. procedures. An articulated command is an expression which has
  36. components which might change over time, while an articulated
  37. procedure is a eve proc in which all the components are assumed to be
  38. articulated over time.  Perhaps an example is in order...
  39.  
  40. Let's say we want to define a ball which can squash and stretch.  One
  41. good trick to do this (short of doing some sort of dynamic simulation)
  42. is to fake it with a "volume preserving" scale.  In eve, to define such 
  43. a "squishy" sphere, we might write the following:
  44.  
  45. ##
  46. set color {1.0 0.0 0.0}
  47. set radius 1.0; set zMin [expr {-1*$radius}]; set zMax $radius
  48. set thetaMax 360.0
  49. set squish 2.0
  50.  
  51. startShape aSphere
  52.   Color $color
  53.   Scale [expr sqrt(1./$squish)] [expr sqrt(1./$squish)] $squish
  54.   Sphere $radius $zMin $zMax $thetaMax
  55. endShape
  56. ##
  57.  
  58. When we evaluate the preceding code, we get a shape object named
  59. aSphere which has 3 RIBCommand objects in it: RIBColor, RIBScale, and
  60. RIBSphere.  We've set the values inside these objects to reflect the
  61. values of the various variables at the time we created the objects.
  62. If we drop this in a WW3DWell, for example, we'll get a nicely squished
  63. sphere.
  64.  
  65. But if you think about it, it seems a bit of a lose that we had
  66. variables describing all sorts of aspects of the shape (its radius,
  67. color, squishiness, etc.) but that once we'd evaluated and compiled
  68. the shape, that information (the names of the variables or
  69. expressions) was gone.  What if we changed the value of $squish later?
  70. It would have no effect on the above model.  That may be what we want,
  71. but we also might want the option of affecting the model later.  Given
  72. that we're on a NeXT, and IB is our friend, the most obvious way to do
  73. this is to attach some sort of UI object to it, like a slider.  But
  74. how do we set up this dependency (i.e. when the value changes the
  75. object gets notified) in the first place?  Well, if we set up a
  76. wrapper object *around* the RIBCommand we can do this.  Such a wrapper
  77. object would get handed a tcl expression, which it would evaluate.
  78. Upon evaluation, this tcl expression should yield a valid RIBCommand.
  79. The wrapper object would then ask the tcl interp to look at the
  80. expression, tell it what variables are in it, and then ask the tcl
  81. interp to trace each of the variables, sending a message to the
  82. wrapper object each time any of the variables was modified so the
  83. wrapper object can mark itself as dirty.  Then when the wrapper object
  84. is asked for its bounding box or asked to render itself, it checks to
  85. see if it's dirty.  If it isn't, it just asks its RIBCommand for its
  86. boudning box or tells it to render itself.  If the object *is* dirty,
  87. it throws away its old RIBCommand and asks the tcl interp to
  88. reevaluate the original expression its based on, and then uses that
  89. RIBCommand.  I call these wrapper objects "EveCommands", and they can
  90. be written as "EveCmd", "ACmd", "ArticulatedCmd", "eveCmd", "aCmd", or
  91. "articulatedCmd".  For example:
  92.  
  93. ##
  94. set color {1.0 0.0 0.0}
  95. set radius 1.0; set zMin -$radius; set zMax $radius
  96. set thetaMax 360.0
  97. set squish 1.0
  98.  
  99. startShape aSphere
  100.   EveCmd {Color $color}
  101.   EveCmd {Scale [expr sqrt(1./$squish)] [expr sqrt(1./$squish)] $squish}
  102.   EveCmd {Sphere $radius $zMin $zMax $thetaMax}
  103. endShape
  104. ##
  105.  
  106. Well, all that is fine and good for relatively simple shapes, but what
  107. about more complicated ones?  What happens when you want to use tcl
  108. procedures (proc) to make your code more readable and reusable?  
  109.  
  110. yyyyyyaaaaaaaaaaabbbbbbbbbbbbbbbbbbaaaaaaaaaaa
  111. yyyyyyaaaaaaaaaaabbbbbbbbbbbbbbbbbbaaaaaaaaaaa
  112. yyyyyyaaaaaaaaaaabbbbbbbbbbbbbbbbbbaaaaaaaaaaa
  113. yyyyyyaaaaaaaaaaabbbbbbbbbbbbbbbbbbaaaaaaaaaaa
  114. yyyyyyaaaaaaaaaaabbbbbbbbbbbbbbbbbbaaaaaaaaaaa
  115. ##
  116. set color {1.0 0.0 0.0}
  117. set radius 1.0; set zMin -$radius; set zMax $radius
  118. set thetaMax 360.0
  119. set squish 1.0
  120.  
  121. proc drawSphere {s r t} {
  122.  
  123.   Scale [expr sqrt(1./$s)] [expr sqrt(1./$s)] $s
  124.   Sphere $r [expr {-1*$r}] $r $t
  125. }
  126.  
  127. startShape aSphere
  128.   EveCmd {Color $color}
  129.   EveProc {drawSphere $squish $radius $thetaMax}
  130. endShape
  131. ##
  132.